home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 10 / FM Towns Free Software Collection 10.iso / ms_dos / tool / mercury / patternm.c < prev    next >
Text File  |  1995-01-06  |  4KB  |  116 lines

  1. /*
  2.  
  3. MercuryInstaller for MS-DOS
  4. 文字列照合ルーチン
  5.  
  6. */
  7.  
  8. #include<ctype.h>
  9. #include<farstr.h>
  10. #include<jctype.h>
  11. #include<jstring.h>
  12. #include"mercury.h"
  13.  
  14. /*------------------------------グローバル変数-------------------------------*/
  15. static    char    Scanpattern[128] = "";
  16. /*-----------------------------全角文字の半角化------------------------------*/
  17. /*  標準のhantozenと違い、カタカナ・ひらがなに完全対応。                    */
  18. /*  なお、変換結果が2バイト(変換不可能な文字、(半)濁点のついた文字)になる場 */
  19. /* 合は、そのデータをbig endianで詰めて返す。                                */
  20. /*---------------------------------------------------------------------------*/
  21. /* 全角文字の内部表現がシフトJISでない場合は(L'c'が使えれば無変更でEUC対応に*/
  22. /* できるのに(;_;))書き直すこと。                                            */
  23. /*---------------------------------------------------------------------------*/
  24. #define    KATA_HANTOZEN(c)    Kanatbl[(c)-0x8340]
  25. #define    A(c)            ((unsigned char)(c))
  26. #define    B(c)            ( ((c)<<8) + (unsigned char)'゙' )
  27. #define    C(c)            ( ((c)<<8) + (unsigned char)'゚' )
  28.  
  29. static    unsigned short    Kanatbl[] = 
  30. {
  31.     A('ァ'),A('ア'),A('ィ'),A('イ'),A('ゥ'),A('ウ'),A('ェ'),A('エ'),
  32.     A('ォ'),A('オ'),A('カ'),B('カ'),A('キ'),B('キ'),A('ク'),B('ク'),
  33.     A('ケ'),B('ケ'),A('コ'),B('コ'),A('サ'),B('サ'),A('シ'),B('シ'),
  34.     A('ス'),B('ス'),A('セ'),B('セ'),A('ソ'),B('ソ'),A('タ'),B('タ'),
  35.     A('チ'),B('チ'),A('ッ'),A('ツ'),B('ツ'),A('テ'),B('テ'),A('ト'),
  36.     B('ト'),A('ナ'),A('ニ'),A('ヌ'),A('ネ'),A('ノ'),A('ハ'),B('ハ'),
  37.     C('ハ'),A('ヒ'),B('ヒ'),C('ヒ'),A('フ'),B('フ'),C('フ'),A('ヘ'),
  38.     B('ヘ'),C('ヘ'),A('ホ'),B('ホ'),C('ホ'),A('マ'),A('ミ'),0x007f,
  39.     A('ム'),A('メ'),A('モ'),A('ャ'),A('ヤ'),A('ュ'),A('ユ'),A('ョ'),
  40.     A('ヨ'),A('ラ'),A('リ'),A('ル'),A('レ'),A('ロ'),0x838e,A('ワ'),
  41.     0x8390,0x8391,A('ヲ'),A('ン'),0x8394,0x8395,0x8396
  42. };
  43.  
  44. static    unsigned short    ds_zentohan(unsigned short c)
  45. {
  46.     if    (jishira(c))
  47.         c = jtokata(c);
  48.  
  49.     if    (jiskata(c))
  50.         c = KATA_HANTOZEN(c);
  51.     else    switch(c)
  52.     {
  53.     case 0x8175:    c = (unsigned char)'「';        break;
  54.     case 0x8176:    c = (unsigned char)'」';        break;
  55.     case 0x8141:    c = (unsigned char)'、';        break;
  56.     case 0x8142:    c = (unsigned char)'。';        break;
  57.     case 0x8145:    c = (unsigned char)'・';        break;
  58.     case 0x814a:    c = (unsigned char)'゙';        break;
  59.     case 0x814b:    c = (unsigned char)'゚';        break;
  60.  
  61.     default:    c = zentohan(c);        break;
  62.     }
  63.  
  64.     return c;
  65. }
  66. /*-----------------------------文字列の「正規化」----------------------------*/
  67. /* ○ひらがなはカタカナにする                                                */
  68. /* ○半角化できる全角文字は半角化する                                        */
  69. /* ○英小文字は大文字にする                                                  */
  70. /*---------------------------------------------------------------------------*/
  71. /* なお、Dataからsrcを引っ張ってくることを考えて、srcはfarポインタ。         */
  72. /*---------------------------------------------------------------------------*/
  73. extern    void    normalize_string(char *dst,char far *src)
  74. {
  75.     unsigned short    c;
  76.  
  77.     while    ((c=*src++)!='\0')
  78.     {
  79.         if    (iskanji(c))
  80.             c = ds_zentohan((c<<8) + *src++);
  81.  
  82.         if    (c>>8)
  83.         {
  84.             *dst++ = c>>8;
  85.             *dst++ = c;
  86.         }
  87.         else
  88.             *dst++ = toupper(c);
  89.     }
  90.  
  91.     *dst = '\0';
  92. }
  93. /*----------------------------パターンマッチの準備---------------------------*/
  94. /* gnu regexで置き換える場合はこれはオートマトン生成関数になる               */
  95. /*---------------------------------------------------------------------------*/
  96. extern    void    patternmatch_init(char *s)
  97. {
  98.     normalize_string(Scanpattern,s);
  99. }
  100. /*---------------------------------照合--------------------------------------*/
  101. extern    int    patternmatch(char far *s)
  102. {
  103.     char    buf[128];
  104.  
  105.     if    (Scanpattern[0]=='\0')
  106.         return 1;
  107.  
  108.     normalize_string(buf,s);
  109.  
  110.     if    (jstrstr(buf,Scanpattern)!=NULL)
  111.         return 1;
  112.     else
  113.         return 0;
  114. }
  115. /*--------------------------End of patternmatch.c----------------------------*/
  116.